package lockDemo.semaphore;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
* @author jie
* @version 创建时间：2018年7月9日 上午10:53:50
*
 *Java Semaphore
 *
 * 1. 详细解释:
 * Semaphore（信号量）是Java并发工具包java.util.concurrent中的一个类。它是一个计数信号量，用于控制同时访问某个特定资源的线程数量。简单地说，它可以限制同时访问资源的线程数。
 *
 * 2. 什么意思:
 * Semaphore维护了一个许可集合。为了访问受限的资源，线程必须首先从信号量获取许可。当许可用尽时，其他所有试图获取许可的线程都会被阻塞，直到有线程释放一个或多个许可。
 *
 * 3. 有什么作用:
 *
 * 限制资源的并发访问：例如，当你有一个资源池（如数据库连接池）并且你想限制同时使用这些资源的线程数。
 * 作为互斥锁：当信号量只有一个许可时，它可以作为一个互斥锁。
 *
*/
public class SemaphoreDemo_02 {
	 static class Student implements Runnable {

	        private int num;
	        private Playground playground;

	        public Student(int num, Playground playground) {
	            this.num = num;
	            this.playground = playground;
	        }

	        @Override
	        public void run() {

	            try {
	                //获取跑道
	            	System.out.println("id=="+Thread.currentThread().getId()+"  name=="+Thread.currentThread().getName());
	                Playground.Track track = playground.getTrack();
	                if (track != null) {
	                    System.out.println("学生" + num + "在" + track.toString() + "上跑步");
	                    TimeUnit.SECONDS.sleep(5);
	                    System.out.println("学生" + num + "释放" + track.toString());
	                    //释放跑道
	                    playground.releaseTrack(track);
	                    System.err.println("*********releaseTrack**********");
	                }
	            } catch (InterruptedException e) {
	                e.printStackTrace();
	            }

	        }
	    }

	    public static void main(String[] args) {

	        Executor executor = Executors.newCachedThreadPool();
	        Playground playground = new Playground();
	        for (int i = 0; i < 100; i++) {
	            executor.execute(new Student(i+1,playground));
	        }

	    }

}
